package com.monster.exception.impl;

import com.monster.exception.ExceptionEnum;
import com.monster.utils.StringUtils;
import lombok.Getter;

/**
 * exception异常
 *
 * @author kuang
 */
public class MonsterSystemException extends Exception implements com.monster.exception.SystemException {
    /**
     * 自定义异常编码
     */
    @Getter
    private String code;
    /**
     * 提供给前台的提示信息
     */
    @Getter
    private String msg;

    /**
     * 详细的提示信息（打印在后台）
     */
    @Getter
    public String info;

    /**
     * 待异常编码和异常信息的构造函数
     *
     * @param code    异常编码
     * @param message 异常信息
     */
    public MonsterSystemException(String code, String message) {
        super(message);
        this.msg = message;
        this.code = code;
    }

    /**
     * 待异常编码和异常信息的构造函数
     *
     * @param code    异常编码
     * @param message 异常信息
     * @param info    后台日志显示的详细信息
     */
    public MonsterSystemException(String code, String message, String info) {
        super(StringUtils.format("{}:{}", message, info));
        this.code = code;
        this.msg = message;
        this.info = info;
    }

    /**
     * 待异常编码和异常信息的构造函数
     *
     * @param code      异常编码
     * @param message   异常信息
     * @param throwable 前一个异常
     */
    public MonsterSystemException(String code, String message, Throwable throwable) {
        super(message, throwable);
        this.code = code;
        this.msg = message;
    }

    /**
     * 待异常编码和异常信息的构造函数
     *
     * @param code      异常编码
     * @param message   异常信息
     * @param info      后台日志显示的详细信息
     * @param throwable 前一个异常
     */
    public MonsterSystemException(String code, String message, String info, Throwable throwable) {
        super(StringUtils.format("{}:{}", message, info), throwable);
        this.code = code;
        this.msg = message;
        this.info = info;
    }

    /**
     * 异常
     *
     * @param em        异常枚举常量接口
     * @param throwable 异常前一个异常
     */
    public MonsterSystemException(ExceptionEnum em, Throwable throwable) {
        super(em.getMsg(), throwable);
        this.code = em.getCode();
        this.msg = em.getMsg();
    }

    /**
     * 异常
     *
     * @param em        异常枚举常量接口
     * @param info      后台日志显示的详细信息
     * @param throwable 异常前一个异常
     */
    public MonsterSystemException(ExceptionEnum em, String info, Throwable throwable) {
        super(StringUtils.format("{}:{}", em.getMsg(), info), throwable);
        this.code = em.getCode();
        this.msg = em.getMsg();
        this.info = info;
    }
}
